#!/usr/bin/python
# -*- coding: utf-8 -*-
#coding=utf-8

import time
import datetime
import threading
import datetimeDemo as tsLog
# 返回某一天(当前时区)0点时间戳
def firstTimeStampOfADay(theDay):
    dStr = theDay.strftime('%Y-%m-%d')
    dt = datetime.datetime.strptime(dStr, "%Y-%m-%d")
    return round(dt.timestamp())

# 返回今天(当前时区)0点毫秒时间戳
def firstTimeStampOfToday():
    return firstTimeStampOfADay(datetime.datetime.now())

gl_LogTsMsBase = 0
def logTsBegin(msg):
    global gl_LogTsMsBase
    gl_LogTsMsBase = round(time.time()*1000)
    print(f"0, {msg}")

def logTs(msg, preNewLineNum=0):
    tsNow = round(time.time()*1000)
    global gl_LogTsMsBase
    if gl_LogTsMsBase == 0:
        gl_LogTsMsBase = tsNow
    threadStr="mt"
    if threading.current_thread().name != "MainThread":
        threadStr="nt"

    preNewLine=''
    while preNewLineNum > 0:
        preNewLine += '\n'
        preNewLineNum -= 1

    print("%s%dms, %s, %s" % (preNewLine, tsNow-gl_LogTsMsBase, threadStr, msg))

    

def demo():
    print("\n\ndatetimeDemo")
    #ts = time.time()
    print("时间戳", round(time.time()))
    print("毫秒时间戳", round(time.time()*1000))

    # 时间戳 --> datetime对象 --> 时间字符串
    ts = time.time()
    dt = datetime.datetime.fromtimestamp(ts)
    dStr = dt.strftime('%Y-%m-%d %H:%M:%S')
    print("时间戳", ts, " --> datetime对象", dt, " --> 时间字符串", dStr)
    '''
        %Y	四位数的年份
        %m	月份（01-12）
        %d	日期（01-31）
        %H	小时（00-23）
        %I	小时（01-12）
        %M	分钟（00-59）
        %S	秒（00-59）
        %f	微秒（000000-999999）
        %z	UTC 偏移量（+HHMM 或 -HHMM）
        %Z	时区名称
        %j	一年中的第几天（001-366）
        %U	一年中的第几周（以周日为一周的第一天）
        %W	一年中的第几周（以周一为一周的第一天）
        %c	本地日期和时间的字符串表示
        %x	本地日期的字符串表示
        %X	本地时间的字符串表示
        %r	本地时间的 12 小时制表示（例如，09:42:35 下午）
        %R	24 小时制的时间表示（例如，21:42）
        %a	简写的星期几名称（例如，Sun）
        %A	完整的星期几名称（例如，Sunday）
        %b	简写的月份名称（例如，Jan）
        %B	完整的月份名称（例如，January）
        %p	AM 或 PM
    '''
    print(dt.strftime('%c 今年第%W周'))

    # 时间字符串 --> datetime对象 --> 时间戳
    dStr = "2023/03/09 12:09:01"
    dt = datetime.datetime.strptime(dStr, "%Y/%m/%d %H:%M:%S")
    ts = dt.timestamp()
    print("时间字符串", dStr, " --> datetime对象", dt, " --> 时间戳", ts)

    print("今天0秒(当前时区)的时间戳", firstTimeStampOfToday())

    yesterdayDt = datetime.datetime.now() + datetime.timedelta(days=-1)
    print("昨天0秒(当前时区)的时间戳", firstTimeStampOfADay(yesterdayDt))

    print("不定参数 0", formatDate())
    print("不定参数 1", formatDate(2023))
    print("不定参数 2", formatDate(2023, 3))
    print("不定参数 3", formatDate(2023, 3, 10))
    print("不定参数 4", formatDate(2023, 3, 10, 9))
    print("不定参数 5", formatDate(2023, 3, 10, 9, 33))
    print("不定参数 6", formatDate(2023, 3, 10, 9, 33, 7))

    print("不定参数kwargs 0", formatDate2())
    print("不定参数kwargs 1", formatDate2(year=2023))
    print("不定参数kwargs 2", formatDate2(year=2023, month=3))
    print("不定参数kwargs 3", formatDate2(year=2023, month=3, day=10))
    print("不定参数kwargs 4", formatDate2(year=2023, month=3, day=10, hour=22))
    print("不定参数kwargs 5", formatDate2(year=2023, month=3, day=10, hour=22, minute=8))
    print("不定参数kwargs 6", formatDate2(year=2023, month=3, day=10, hour=22, minute=8, second=3))

def formatDate2(**kwargs):
    #print("不定入参", kwargs, "类型是字典", type(kwargs))
    year = 2000 if 'year' not in kwargs else int(kwargs['year'])
    month = 1   if 'month' not in kwargs else int(kwargs['month'])
    day = 1     if 'day' not in kwargs else int(kwargs['day'])
    hour = 0    if 'hour' not in kwargs else int(kwargs['hour'])
    minute = 0  if 'minute' not in kwargs else int(kwargs['minute'])
    second = 0  if 'second' not in kwargs else int(kwargs['second'])

    dStr = "%04d/%02d/%02d %02d:%02d:%02d" % (year, month, day, hour, minute, second)  # 格式化 %02d 表示 两位整形，不够的用0填充
    dt = datetime.datetime.strptime(dStr, "%Y/%m/%d %H:%M:%S")
    return dt
    
def formatDate(*args):
    year = 2000
    month = 1
    day = 1
    hour = 0
    minute = 0
    second = 0

    # print("不定参数args", args, "类型是元组", type(args))
    if len(args) > 0:
        year = int(args[0])
    if len(args) > 1:
        month = int(args[1])
    if len(args) > 2:
        day = int(args[2])
    if len(args) > 3:
        hour = int(args[3])
    if len(args) > 4:
        minute = int(args[4])
    if len(args) > 5:
        second = int(args[5])

    dStr = "%04d/%02d/%02d %02d:%02d:%02d" % (year, month, day, hour, minute, second) # 格式化 %02d 表示 两位整形，不够的用0填充
    dt = datetime.datetime.strptime(dStr, "%Y/%m/%d %H:%M:%S")
    return dt

if __name__ == '__main__':
    demo()